// 作为一种数据类型
// 作为参数：一般情况下，把函数作为参数的目的就是为了获取函数内部的异步操作结果
// 作为返回值
// 十分灵活

// 这是同步的
function add(x, y) {
  return x + y;
}
add(10, 20);

// 这是异步的
console.log(1);
setTimeout(function () { // 不会等待
  console.log(2);
  console.log('Hello');
}, 0);
console.log(3);
// 即使 定时器0秒延迟立即执行，也是在所有同步代码执行后才执行异步代码
// 输出 1 3 2 hello的顺序


function fn(x, y) {
  setTimeout(function () {
    let ret = x + y;
    return ret;
  }, 1000)
}

console.log(fn(1, 2)); // 得到undefined,异步的，是无法通过这种方式拿到的

function fn2(x, y) {
  let ret;
  setTimeout(function () {
    ret = x + y;
  }, 1000);
  return ret;
}

console.log(fn2(1, 2)); // 这也不行

// 注意，凡是需要得到一个函数内部异步操作的结果
// 这种情况下必须通过回调函数

function add2(x, y, callback) {
  setTimeout(function () {
    let ret = x + y;
    callback(ret);
  })
}
add2(1, 2, function (ret) {
  console.log(ret);
});
// 异步的获取只能通过回调函数的方式，只要把异步操作的结果交给回调函数，
// 用户在使用的时候，就需要关心回调函数对异步操作的值的具体使用
